تحميل النواة من القرص المرن

 

هذا الدرس أردته استمرارا للدرس الذي وضعه الأخ   IDOIT و الذي يوشح كيفية كتابة قطاع الانطلاق.

 

الهدف هو المرور إلى المرحلة الطبيعية الموالية و هي تحميل النواة من القرص المرن.

 

المطلوب قراءة الدرس الأول المشار إليه أعلاه حتى تتمكن من فهم ما سوف يأتي.

 

إذا تتبعت الدر س السابق فقد وصلت إلى مرحلة نسخ جملة على الشاشة النصية بعد تحميل قطاع الانطلاق، وهذا هو البرنامج

 

[BITS 16]

EntryPoint:
      mov ax,07c0h
      mov ds,ax
      mov es,ax

      mov ax,09000h
      mov ss,ax
      mov sp,0ffffh

      mov si,Salam
      call ShowMsg

k_loop:
      jmp k_loop

ShowMsg:
      push ax
      push bx
.loop_start:
      lodsb
      cmp al,0
      je .loop_end
      mov ah,0Eh
      mov bx,07h
      int 10h
      jmp .loop_start
.loop_end:
      pop bx
      pop ax
      ret



      Salam db "Salam Alikom !",13,10,0

      times 510-($-$$) db 0

      DW 0AA55h
 

 

 

 

 

 

الان سوف نقوم بما يلي

 

1-     استعمال الانقطاع 0x13 من أجل تحميل النواة :

2-     كتابة برنامج النواة : في هذه المرحلة سوف نكتفي بعرض جملة أخرى على الشاشة، وفي مراحل قادمة إن شاء الله سنقوم بأشياء أكثر جدية

 

شرح  موجز لبنية الأقراص :

 

ناقص : صورة لبنية القرص

 

داخل الغلاف البلاستيكي يوجد قرص مغلف بشريط مغناطيسي ( مثل أشرطة الفيديو)، عندما يراد تخزين المعلومات داخل القرص يقوم قارئ الأقراص بتشفير المعلومات على شكل رموز مغناطيسية. بالطريقة نفسها يقوم القارئ عند القراءة بفك هذه الرموز و ترجمتها إلى رموز ثنائية (Binary).

يحتوي القارئ على : -  محرك يقوم بجعل القرص يدور بسرعة معينة.   – رأسين من أجل القراءة و الكتابة، كل رأس في جهة ( هذا لأن القرص المرن يحتوي على جهتين). – كل من الرأسين متصل بذراع آلي يقوم بتحريك الرأس إلى وسط القرص أو إلى جانبه بطريقة دائرية.

تتقسم مساحة القرص إلى حلقات دائرية بدءا بحواف القرص و انتهاء بوسطه ( أنظر الرسم)، كل حلقة مقسمة إلى عدة قطاعات. كل قطاع يحتوي عى نفس الكمية من المعلومات، في أغلب الأحيان يكون طول القطاع 512 بايت.

الأقراص الصلبة لها نفس التصميم، الفرق الوحيد هو أنه بدل قرص بلاستيكي يوجد قرص من مادة صلبة كالزجاج مما يتيح لها الدوران بسرعة أكبر بكثير من الأقراص المرنة. ذلك ما يجعل القراءة والكتابة في الأقراص الصلبة أسرع بكثير. أيضا بدل الوجه المزدوج للقرص المرن  توجد به عدة أقراص مرتبة فوق بعضها البعض.

بما أن للقرص المرن وجهان (و للقرص الصلب عدة أوجه)، تشكل الحلقات التي توجد في نفس الترتيب على مختلف الأوجه ما يشبه الموشور.

من وجهة نظر المبرمج، من أجل قراءة أو كتابة قطاع معين ينبغي تحديد : 1- رقم الموشور، 2- رقم الجهة ( أو الرأس) داخل الموشور، 3- رقم القطاع داخل الحلقة.

يتم تخزين البيانات وفقا للترتيب التالي، أولا القطاع الأول على الجهة الأولى الموشور الموجود على أقصى الحافة، ثم القطاع الثاني إلى أن تستنفذ كل قطاعات الجهة، ثم يتم المرور إلى الجهة الثانية في نفس الموشور و هكذا دواليك، بعد ذلك يتم المرور إلى الموشور الثاني فالثالث إلى غاية آخر موشور في الوسط.

 

يجب التنبيه هنا على أن أرقام القطاعات تبدأ من 1 بينما أرقام الموشورات والجهات تبدأ من الصفر.

 

بعد هذه المقدمة يمكننا المرور إلى كتابة البرنامج.

 

مباشرة تحت السطر Call ShowMsg أدخل التعليمات التالية

 

xor ax,ax

int 0x13
 

استعمال الوظيفة 0 :  الهدف هو تهيئة القرص من أجل القراءة

الإنقطاع 0x13  هو المدخل إلى الوظائف المتعلقة بالأقراص

 

mov ax, 0x1000

mov es,ax

mov bx,0

mov ah,2

mov al,1

mov ch,0

mov cl,2

mov dh,0

mov dl, 0

int 0x13 

استعمال الوظيفة  2: تقوم بقراءة القطاعات من القرص المرن أو الصلب

 

es:bx -  الموقع الذي سيحمل إليه القطاع (أو القطاعات) في الذاكرة في هذه الحالة : 0x100:0 (=  0x1000)

ah        -  رقم الوظيفة (2)

dh       – رقم الوجه ( القرص المرن له وجهان الوجه الأول يبتدص ب 0)

dl         -  رقم القارئ ( 0: القرص المرن A )

ch        – رقم الموشور

cl         – رقم القطاع

al         – عدد القطاعات المطلوب قراءتها

 

 

 

بعد هذه التعليمات نكون قد حملنا النواة إلى العنوان 0x1000:0 (أي العنوان 0x10000[=0x1000*4+0] بالصيغة الخطية) . للبدأ بتنفيذ النواة نقوم بالقفز إلى العنوان المذكور.

 

jmp dword 0:0x1000

يتم القفز إلى العنوان الذي حملت إليه النواة

 

 

2- كتابة برنامج النواة

 

 

هذا البرنامج بسيط و يقوم فقط بكتابة جملة kernel is loaded على الشاشة.

 

أنقل هذه التعليمات في ملف kernel.s ثم احفظ الملف في نفس المجلد الذي يحتضن ملف قطاع الانطلاق.

 

[BITS 16]

 

ORG 0

التعليمات مشفرة على 16 بايت

 

يتم إخبار Nasm بأن السجل cs يحتوي على العنوان 0x7C0

      mov si,krnlMsg
      call ShowMsg

k_loop:
      jmp k_loop

ShowMsg:
      push ax
      push bx
.loop_start:
      lodsb
      cmp al,0
      je .loop_end
      mov ah,0Eh
      mov bx,07h
      int 10h
      jmp .loop_start
.loop_end:
      pop bx
      pop ax
      ret

 

krnlMsg db « kernel is loaded »,13,10,0

يمكن الاستعانة بنفس الكود الذي استعمل في كتابة قطاع الانطلاق.

 

 

 

للترجمة نستعمل نفس التعليمة

 

Nasm –f bin boot.s o boot.bin

Nasm –f bin kernel.s kernel.bin

 

لنقل الملفات إلى القرص المرن

 

cat  boot.bin kernel.bin | dd of=/dev/fd0 bs=512 count=2880

 

بالنسبة لمستعملي ويندوز

 

copy /b boot.bin+kernel.bin  image